/***********************************************************************************************
 * File Name   :	system_init.c
 * Programmer  : 	kmist
 * Start Date  : 	10/17/20
 * Last Update : 	10-17, 2020
 *----------------------------------------------------------------------------------------------
 *Functions:
 *	 void system_show_splash(void)	//展示系统启动画面
 *   void module_init(void)         //硬件模块初始化
 *   void system_init(void)			//系统初始化函数
 *	 void system_reinit(void)		//系统反初始化函数
 *
 *Timer：
 *	 void time_base(void *args)	    //系统基本时间定时器
 ***********************************************************************************************/

#include "user_extern.h"

os_timer_t time_base_1000ms;
os_timer_t time_alarmScan_20000ms;
static const char *TAG = "system_inti";

/*********************************************************************
 *  名称： time_base
 *  功能： 系统时间计时定时器
 *  参数： void
 *  返回值：void
 ********************************************************************/
void time_base(void *args)
{
    if (mtime.sntp_syn == 1)
    {
        time(&mtime.g_timestamp);
        mtime.sntp_syn = 0;
    }
    mtime.g_timestamp++;
}

/*********************************************************************
 *  名称： system_show_splash
 *  功能： 系统启动动画
 *  参数： void
 *  返回值：void
 ********************************************************************/
void system_show_splash(void)
{
    oled.draw_bmp(0, 0, 8, 128, BMP_COVER_MODE, (void *)system_splash);
    oled.refresh_all(1);
}

/*********************************************************************
 *  名称： module_init
 *  功能： 模块初始化函数
 *  参数： void
 *  返回值：void
 ********************************************************************/
void module_init(void)
{
    usart_init();
    button_init();
    //tone.on();
    oled.init();
    wifi_init();
    falsh_spiffs_init(); /* NVS文件系统 */
}

/*********************************************************************
 *  名称： system_init
 *  功能： 系统参数初始化
 *  参数： void
 *  返回值：void
 ********************************************************************/
void system_init(void)
{
    uint32_t len_tmp = 0;
    Dsystem.initialization_flag = 0;
    flash_get_value_i8(SYSTEM_VALUE, SYS_FIRST_INIT, &Dsystem.initialization_flag); /* 0:FIRST_INIT 1:ALREAD_INIT*/
    if (Dsystem.initialization_flag == 1)
    {
        /* 已经初始化 读取参数 */
        Dsystem.windows_cur_id = WIN_UI_DESKTOP;
        flash_get_value_i8(SYSTEM_VALUE, SYS_SNTP_EN, &Dsystem.sys_sntp_en);
        flash_get_value_i8(SYSTEM_VALUE, SYS_ALARM_EN, &Dsystem.sys_alarm_en);
        flash_get_value_i8(SYSTEM_VALUE, SYS_ALARM_HOU, &mtime.g_alarm[0].tm_hour);
        flash_get_value_i8(SYSTEM_VALUE, SYS_ALARM_MIN, &mtime.g_alarm[0].tm_min);
        flash_get_value_i8(SYSTEM_VALUE, SYS_LIGHT_LEVEL, &Dsystem.sys_light_level);
        flash_get_value_i8(SYSTEM_VALUE, SYSTEM_VOICE_EN, &Dsystem.sys_voice_ctrl);
        flash_get_value_i8(SYSTEM_VALUE, SYSTEM_WEATHER_PROVINCE, &weather.province_code);
        flash_get_value_i16(SYSTEM_VALUE, SYSTEM_WEATHER_CITY, &weather.city_code);
        flash_get_value_i8(SYSTEM_VALUE, SYSTEM_WIFI_ENABLE, &Dsystem.sys_wifi_enable);

        flash_get_value_str(SYSTEM_VALUE, SYSTEM_WIFI_SSID, wifi.ssid, &len_tmp);
        flash_get_value_str(SYSTEM_VALUE, SYSTEM_WIFI_PASS, wifi.passwd, &len_tmp);

        ESP_LOGI(TAG, "==== ssid:%s pass:%s====\n", wifi.ssid, wifi.passwd);
        //...
    }
    else if (Dsystem.initialization_flag == 0)
    {
        /* 未初始化 */
        //Dsystem.windows_cur_id = WIN_UI_WIZARD_INIT;
        Dsystem.sys_sntp_en = 1;
        Dsystem.sys_alarm_en = 0;
        mtime.g_alarm->tm_hour = 0;
        mtime.g_alarm->tm_min = 0;
        Dsystem.sys_light_level = 5;
        Dsystem.sys_voice_ctrl = 1;
        weather.province_code = 1;
        weather.city_code = 1;
        Dsystem.sys_wifi_enable = 1;
        strcpy(wifi.ssid, "digimon");
        strcpy(wifi.passwd, "12345678");
        flash_set_value_i8(SYSTEM_VALUE, SYS_SNTP_EN, Dsystem.sys_sntp_en);
        flash_set_value_i8(SYSTEM_VALUE, SYS_ALARM_EN, Dsystem.sys_alarm_en);
        flash_set_value_i8(SYSTEM_VALUE, SYS_ALARM_HOU, (uint8_t)mtime.g_alarm[0].tm_hour);
        flash_set_value_i8(SYSTEM_VALUE, SYS_ALARM_MIN, (uint8_t)mtime.g_alarm[0].tm_min);
        flash_set_value_i8(SYSTEM_VALUE, SYS_LIGHT_LEVEL, Dsystem.sys_light_level);
        flash_set_value_i8(SYSTEM_VALUE, SYSTEM_VOICE_EN, Dsystem.sys_voice_ctrl);
        flash_set_value_i8(SYSTEM_VALUE, SYSTEM_WEATHER_PROVINCE, weather.province_code);
        flash_set_value_i16(SYSTEM_VALUE, SYSTEM_WEATHER_CITY, weather.city_code);
        flash_set_value_i8(SYSTEM_VALUE, SYSTEM_WIFI_ENABLE, Dsystem.sys_wifi_enable);
        flash_commit();

        /* 进入初始化引导界面 */
        Dsystem.windows_cur_id = WIN_UI_OTHERMO;
        Dsystem.windows_sub_id = WIN_SUI_WIZARD_INIT;
    }

    /* 屏幕刷新 */
    Dsystem.ui_frame_time = 100;
    /* 亮度等级 */
    oled.set_light_level(Dsystem.sys_light_level);
    /* 按键音 */
    if (Dsystem.sys_voice_ctrl == 1)
        tone.on();

    if (Dsystem.initialization_flag == 1)
    {
        /* 时间定时器 */
        os_timer_disarm(&time_base_1000ms);
        os_timer_setfn(&time_base_1000ms, (os_timer_func_t *)time_base, 0);
        os_timer_arm(&time_base_1000ms, 1000, 1);

        mtime.add_alarm();

        if (Dsystem.sys_wifi_enable == 1)
        {
            wifi.init_sta();
            /* sntp init */
            mtime.msntp_init();
            /* weather init */
            weather.init();
        }
    }
}

/*********************************************************************
 *  名称： system_reinit
 *  功能： 系统格式化参数
 *  参数： void
 *  返回值：void
 ********************************************************************/
void system_reinit(void)
{
    Dsystem.initialization_flag = 0;
    flash_set_value_i8(SYSTEM_VALUE, SYS_FIRST_INIT, Dsystem.initialization_flag); /* 0:FIRST_INIT */
    flash_commit();
    esp_restart();
}